﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using CAOS.Entity;
using CAOS.Facade;

namespace CAOS.Web
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class CAOSServices : System.Web.Services.WebService
    {
        UnityOfWork.UnidadeDeTrabalho UnidadeDeTrabalho = new UnityOfWork.UnidadeDeTrabalho();

        #region Facades

        private UsuarioFacade usuarioFacade = null;

        public UsuarioFacade UsuarioFacade
        {
            get
            {
                if (usuarioFacade != null)
                {
                    return usuarioFacade;
                }

                usuarioFacade = new UsuarioFacade(this.UnidadeDeTrabalho);
                return usuarioFacade;
            }
        }

        private AcessoFacade acessoFacade = null;

        public AcessoFacade AcessoFacade
        {
            get
            {
                if (acessoFacade != null)
                {
                    return acessoFacade;
                }

                acessoFacade = new AcessoFacade(this.UnidadeDeTrabalho);
                return acessoFacade;
            }
        }

        #endregion

        public CAOSServices()
        {
            acessoFacade = new AcessoFacade(UnidadeDeTrabalho);
            usuarioFacade = new UsuarioFacade(UnidadeDeTrabalho);
        }

        [WebMethod]
        public bool AutenticarSistema(string sigla, string codigoAutenticacao)
        {
            Sistema sistema = new Sistema() { Sigla = sigla, CodigoAutenticacao = codigoAutenticacao };
            bool sistemaAutenticado = acessoFacade.SistemaAutenticado(sistema);
            return sistemaAutenticado;
        }

        [WebMethod]
        public bool AutenticarUsuario(string siglaSistema, string codigoAutenticacao, string login, string senha)
        {
            Sistema sistema = new Sistema() { Sigla = siglaSistema, CodigoAutenticacao = codigoAutenticacao };
            bool sistemaAutenticado = acessoFacade.SistemaAutenticado(sistema);

            if (sistemaAutenticado == false)
            {
                return false;
            }

            return acessoFacade.AutenticarUsuario(login, senha, sistema);
        }

        [WebMethod]
        public PapelSerializavel[] ObterPerfisUsuario(string siglaSistema, string codigoAutenticacao, string login)
        {
            Sistema sistema = new Sistema() { Sigla = siglaSistema, CodigoAutenticacao = codigoAutenticacao };
            bool sistemaAutenticado = acessoFacade.SistemaAutenticado(sistema);

            if (sistemaAutenticado == false)
            {
                return null;
            }

            Usuario usuario = usuarioFacade.LerUsuario(login);

            if (usuario == null)
            {
                return null;
            }

            var papeis = (from p in usuario.Papeis
                          select new PapelSerializavel { Codigo = p.Codigo, Nome = p.Nome, IsPapelGestor = p.IsPapelGestor }).ToArray();

            return papeis;
        }

        [WebMethod]
        public bool VerificarPermissaoRecursoUsuario(string siglaSistema, string codigoAutenticacao, string loginUsuario, string codigoRecurso)
        {
            Sistema sistema = new Sistema() { Sigla = siglaSistema, CodigoAutenticacao = codigoAutenticacao };
            bool sistemaAutenticado = acessoFacade.SistemaAutenticado(sistema);

            if (sistemaAutenticado == false)
            {
                return false;
            }

            return acessoFacade.VerificarPermissaoRecursoUsuario(siglaSistema, loginUsuario, codigoRecurso);
        }

        [WebMethod]
        public bool VerificarPermissaoRecursoPapel(string siglaSistema, string codigoAutenticacao, string codigoRecurso, string nomePapel)
        {
            Sistema sistema = new Sistema() { Sigla = siglaSistema, CodigoAutenticacao = codigoAutenticacao };
            bool sistemaAutenticado = acessoFacade.SistemaAutenticado(sistema);

            if (sistemaAutenticado == false)
            {
                return false;
            }

            return acessoFacade.VerificarPermissaoRecursoPapel(siglaSistema, codigoRecurso, nomePapel);
        }
    }
}
